布尔逻辑

  第3章介绍的 bool 类型可以有两个值:truefalse。这种类型常用于记录某些操作的结果,以便操作这些结果。特别是,bool 类型可用于存储比较的结果。

19世纪中叶的英国数学家乔治∙布尔为布尔逻辑奠定了基础。

  考虑下述情形(如本章引言所述):要根据变量 myVal 是否小于 10,来确定是否执行代码。为此,需要确定语句 “myVal 小于10” 的真假,即需要了解比较的布尔结果。

  布尔比较需要使用布尔比较运算符(也称为关系运算符),如表 4-1 所示

表4-1 布尔比较运算符

运算符 类别 示例表达式 结果
= 二元 var1 = var2 == var3; 如果 var2 等于 var3var1 的值就是 true,否则为 false
!= 二元 var1 = var2 != var3; 如果 var2 不等于 var3var1 的值就是 true,否则为 false
< 二元 var1 = var2 < var3; 如果 var2 小于 var3var1 的值就是 true,否则为 false
> 二元 var1 = var2 > var3; 如果 var2 大于 var3var1 的值就是 true,否则为 false
<= 二元 var1 = var2 <= var3; 如果 var2 小于等于 var3var1 的值就是 true,否则为 false
>= 二元 var1 = var2 >= var3; 如果 var2 大于等于 var3var1 的值就是 true,否则为 false

表4-1 中,var1 都是 bool 类型的变量,var2var3 则可以是不同类型。

在代码中,可以对数值使用这些运算符:

        bool isLessThan10;
        isLessThan10 = myVal < 10;

  如果 myVal 存储的值小于 10,这段代码就给 isLessThan10 赋予 true 值,否则赋予 false 值。

  也可以对其他类型使用这些比较运算符,例如字符串:

        bool isKarli;
        isKarli = myString == "Karli";

  如果 myString 存储的字符串是 KarliisKarli 的值就为 true

  也可以对布尔值使用这些运算符:

        bool isTrue;
        isTrue = myBool == true;
  • 但只能使用 ==!= 运算符。

💡 一个常见的代码错误是,无意间假定由于 val1 < var2false,所以 val1 > var2true。如果 var1 == var2,则这两个语句都是 false

  在处理布尔值时,还有其他一些布尔运算符,如表 4-2 所示

表4-2 处理布尔值的布尔运算符

运算符 类别 示例表达式 结果
! 一元 var1 = !var2; 如果 var2falsevar1 的值就是 true,否则为 false(逻辑非)
& 二元 var1 = var2 & var3; 如果 var2var3 都是 truevar1 的值就是 true,否则为 false(逻辑与)
| 二元 var1 = var2 \ var3; 如果 var2var3true(或两者都是),var1 的值就是 true,否则为 false(逻辑或)
^ 二元 var1 = var2 ^ var3; 如果 var2var3 中有且仅有一个 truevar1 的值就是 true,否则为 false(逻辑异或)

上面的代码也可以表述为:

        bool isTrue;
        isTrue = myBool & true;

  &| 运算符也有两个类似的运算符,称为条件布尔运算符(见 表 4-3)。

表4-3 条件布尔运算符

运算符 类别 示例表达式 结果
&& 二元 var1 = var2 && var3; 如果 var2var3 都是 true,否则为 false(逻辑与)
|| 二元 var1 = var2 \ \ var3; 如果 var2var3true(或两者都是),var1 的值就是 true,否则为 false(逻辑或)

  这些运算符的结果与 &| 完全相同,但得到结果的方式有一个重要区别:其性能比较好。两者都是检查第一个操作数的值(表 4-3 中的 var2),如果已经能判断结果,就根本不处理第二个操作数( 表 4-3 中的 var3

  如果 && 运算符的第一个操作数是 false,就不需要考虑第二个操作数的值了,因为无论第二个操作数的值是什么,其结果都是 false。同样,如果第一个操作数是 true|| 运算符就返回 true,不必考虑第二个操作数的值。但上面的 &| 运算符却不是这样。它们总是要计算两个操作数。

  因为操作数的计算是有条件的,如果用 &&|| 运算符来替代 &|,性能会有一定提高。在大量使用这些运算符的应用程序中这表现得尤为明显。作为一个经验法则,尽可能使用 &&|| 运算符。这些运算符有时用于比较复杂的情形,例如,只有第一个操作数包含某个值时,才计算第二个操作数:

        var1 = (var2 != 0) && (var3 / var2 > 2);

  如果 var2 是 0,则 var3 除以 var2 就会导致 “除0错误”,或者把 var1 定义为无穷大(对于某些类型如 float 来说,可能出现后一种情形,也是可以检测到的)。

  读者此时可能会问,为什么会有 &| 运算符。原因是这两个运算符可用于对数值执行操作。实际上,它们处理的是存储在变量中的一些列位,而不是变量的值。请参见稍后的 “按位运算符”。

🔚